package com.bjpowernode.config.handler;

import com.bjpowernode.result.R;
import org.springframework.dao.DataIntegrityViolationException;
import org.springframework.dao.DuplicateKeyException;
import org.springframework.security.access.AccessDeniedException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

/**
 * 全局统一的异常处理类
 *
 */
@RestControllerAdvice  //aop，对所有的controller进行拦截
public class GlobalExceptionHandler {

    /**
     * 拦截Exception异常，包括其子类异常
     *
     * @param e
     * @return
     */
    @ExceptionHandler
    public Object processException(Exception e) {
        e.printStackTrace();
        return R.FAIL(e.getMessage());
    }

    /**
     * 拦截AccessDeniedException异常
     *
     * @param e
     * @return
     */
    @ExceptionHandler
    public Object processException(AccessDeniedException e) {
        e.printStackTrace();
        return R.FAIL("权限不足");
    }

    /**
     * 拦截DataIntegrityViolationException异常（精确匹配了该异常类型）
     *
     * 如果拦截中有多个方法，会根据异常类型优先进行精确匹配
     *
     * @param e
     * @return
     */
    @ExceptionHandler
    public Object processException(DataIntegrityViolationException e) {
        e.printStackTrace();
        return R.FAIL("数据库外键约束异常");
    }

    /**
     * 捕获唯一索引冲突的异常
     *
     * @param e
     * @return
     */
    @ExceptionHandler
    public Object processException(DuplicateKeyException e) {
        e.printStackTrace();
        return R.FAIL("数据库唯一索引冲突");
    }
}
